package com.shujia

object Code01BaseScala {
  def main(args: Array[String]): Unit = {

    // 单行注释

    /*
      多行注释
      多行注释
     */

    /**
     * 文档注释
     * 文档注释
     * 文档注释
     */

    // 变量
    var i = 10
    println(i)
    i = 11
    println(i)

    // 常量
    val j = 10;
    println(j) // 对于单行代码可以不使用;结尾 但是多行代码可以使用;进行分割

    //    j = 11  // 常量不可以重新赋值
    println(j)


    /*
      Scala基本数据类型：
          ① Scala中变量的类型标记是使用 :数据类型
          ② Scala数据类型种类包括：Byte、Short、Int、Long、Double、Float、Boolean、Char、String
          ③ 引用类型的父类是 AnyRef
          ④ Scala中的数据类型相当于Java中的包装类
          ⑤ Scala中的泛型需要填充数据类型，其标记为[]
          ⑥ Scala中的String类型引用的是Java中的String类型，但是通过隐式转换为String类型添加了一些其他方法

     */


    var string: String = "this is String"

    val byte: Byte = 0
    println(byte)
    var int: Int = 10
    var short: Short = 100
    var long: Long = 1000
    var double: Double = 3.14
    var float: Float = 3.14F
    var char: Char = 'c'
    var boolean: Boolean = true


    // 类型转换
    var c: Int = 97
    println(c.toChar)
    println(c.toLong)

    var str: String = "a"
    //    println(str.toInt)
    // java.lang.NumberFormatException: For input string: "a"

    // 对于String来说其实就是维护一个数组，数组中每个下标的类型为char
    val c1 = str.charAt(0) // charAt 要求传入下标
    println(c1.toInt)

    val dou: Double = 3.14
    println(dou.toFloat)

    val str2: String = "3.14"
    //    println(str2.toInt)
    println(str2.toFloat)
    println(str2.toDouble)

    // 字符串常见函数

    var str3 = "abc,DEF,AS"

    // 对于获取到的变量可以直接使用 快捷方式 var,在弹出的提示框中选择 Settings 勾选 local definition
    val strings: Array[String] = str3.split(",")
    println(strings) // [Ljava.lang.String;@3f0ee7cb
    println(strings(1)) // 数组中根据下标取值，Scala使用的是() Java使用的是[]

    //    str3.toLong
    strings.foreach(println) // 通过foreach获取数组中的每一个元素，传入println函数对每个元素进行打印

    // Java中提供的方法
    println(str3.toLowerCase) // 将字符串转小写

    // Scala中提供的方法
    val str4: String = "abc"
    val str6: String = "ab"
    var str5: String = str6 + "c"

    println(str4.equals(str5)) // equals表示对两个字符串的值进行比较
    println(str4.eq(str5)) // eq 表示对两个字符串的内存地址进行比较
    println(str4 == str5) // Scala中的 == 是用于判断值是否相同

    println(str4.head)  // 获取第一个字符
    println(str4.tail)  // 获取除第一个以外的其他字符
    println(str4.take(2)) // 获取前n个
    println(str4.length) //长度
    println(str4.size)  //长度
    println(str4.sorted) // 根据ASC码值进行排序
    println(str4.isEmpty) // 判断是否为空


    // 相关运算符
    // 1.算数运算符
    println( 10 + 3)
    println( 10 - 3)
    println( 10 * 3)
    println( 10 / 3) // /表示对两边做整数整除
    println( 10 / 3.0)
    println( 10 % 3)

    // 2.关系运算符
    println( 3 > 4)
    println( 3 < 4)
    println( 3 >= 4)
    println( 3 <= 4)
    println( 3 != 4)
    println( 3 == 4)


    // 字符串也可以按照字典序比较大小
    println("a" < "b")
    println("ab" < "a")


    // 位运算符
    println(7 & 4)
    println(7 | 4)
    println(7 ^ 4)

    // 逻辑运算符
    println("*"*10)
    println(true && false) // false
    println(true || false) // true
    println(true ^ true) // 对于相同的取false 不同的取true
    println(!true)

    var num1 = 10;
    var num2 = 20;
    var num3 = 30

    println("%d * %d = %d",num1,num2,num3) // 实际上调用的还是Java中的System.out.println()
    printf("%d * %d = %d",num1,num2,num3)
    println("#"*10)
    println(s"%d * %d = %d".format(num1,num2,num3)) // format操作可以对 %表达式进行格式化
    println(s"$num1 * $num2 = $num3")
    println(s"${num1} * $num2 = ${num1 * num2}") // ${}中可以传入一个表达式，对于单个的变量可以省略 {}


    var sql:String = "SELECT * FROM student where clazz = ''";

    // 对于Scala中可以使用多行字符串表达式

    val sqlMoreStr: String =
      """
        |SELECT
        |*
        |FROM student
        |where clazz = ''
        |""".stripMargin

    println(sqlMoreStr)


    // 赋值运算符

    var i1:Int = 10
    var i2:Int = 20

    i1 += i2   //是 .+=(i2) 的简约写法
    println(i1)

    i1.+=(i2)  // 对于对象的符号，实际上调用的是其中的函数
    println(i1)

    





  }
}
